/**********************************************************************************************************
** 程序文件：	CRC16.h
** 程序版本：	1.0
** 开发环境：	RealView MDK-ARM 5.11
** 程序作者：	盖书永
** 修改日期：	2014年12月15日09:44:16
** 文件功能：	CRC-16校验，多项式：x16+x15+x2+1，简记式：8005，标准引用：IBM SDLC
** 修改日志：
**********************************************************************************************************/
#ifndef _CRC16_H
#define _CRC16_H
 
typedef struct
{
	unsigned char CRC16_H;
	unsigned char CRC16_L;
}CRC16_CTX;		//记录CRC16执行的上下文

/**********************************************************************************************************
* 函数名称： void CRC16_Init(CRC16_CTX *ctx)
* 函数说明： CRC16初始化 （适用于数据被拆分为多个数据块或者数据流数据进行校验）
* 输入参数： 结构体指针
* 返回参数： 无
**********************************************************************************************************/
void CRC16_Init(CRC16_CTX *ctx);

/**********************************************************************************************************
* 函数名称： void CRC16_Update(CRC16_CTX *ctx, char *updata, int len)
* 函数说明： 对数据进行CRC16处理
* 输入参数： 结构体指针，输入数据缓存区指针，输入数据长度
* 返回参数： 无
**********************************************************************************************************/
void CRC16_Update(CRC16_CTX *ctx, char *updata, int len);

/**********************************************************************************************************
* 函数名称： unsigned short CRC16_Final(CRC16_CTX *ctx)
* 函数说明： 输出CRC16校验结果
* 输入参数： 结构体指针
* 返回参数： CRC16校验值
**********************************************************************************************************/
unsigned short CRC16_Final(CRC16_CTX *ctx);

/**********************************************************************************************************
* 函数名称： unsigned short CRC16(char *updata, int len)
* 函数说明： 对数据进行CRC16校验，无需初始化，直接输出结果。（适用于不拆分的数据块进行校验）
* 输入参数： 数据缓存区指针，数据长度
* 返回参数： CRC16校验值
**********************************************************************************************************/
unsigned short CRC16(char *updata, int len);

/**********************************************************************************************************
* 函数名称： int CRC16_Padding(char *updata, int len)
* 函数说明： 数据进行CRC16计算并填充，CRC16高字节在前，低字节在后
* 输入参数： 数据缓存区指针，数据长度
* 返回参数： 返回填充CRC16后的数据长度
**********************************************************************************************************/
int CRC16_Padding(char *updata, int len);

/**********************************************************************************************************
* 函数名称： int CRC16_Check(char *updata, int len)
* 函数说明： 数据进行CRC16检查，要求被检查数据填充方式为CRC16高字节在前，低字节在后
* 输入参数： 数据缓存区指针，数据长度
* 返回参数： 0：失败，1：成功
**********************************************************************************************************/
int CRC16_Check(char *updata, int len);

/**********************************************************************************************************
* 函数名称： int XmodemCRC16(char *ptr, int count)  
* 函数说明： XModem协议CRC16校验算法
* 输入参数： 校验内容，校验内容长度
* 返回参数： 16位校验值
**********************************************************************************************************/
int XmodemCRC16(char *ptr, int count);

#endif
